/**
 * 相对误差计算函数。
 *
 * 相对误差计算比表面更为复杂[1,2]。传统计算公式为`|(A-E)/E|`，但存在两个关键问题：
 * 1. 当期望值为零时，任何非零实际值都会产生无限大相对误差，这与直觉相悖（如期望电压为0时，测量到0.1伏特不应视为无穷大误差）
 * 2. 该公式不满足数学度量的严格定义[3]。[4]提出使用`|ln(|A/E|)|`定义，但仅适用于正值场景（如-10与10的误差会被误判为0）
 *
 * 本实现遵循常规方案：
 * - 当实际值与期望值均为零时返回0
 * - 当期望值为零而实际值非零时返回Infinity
 * - 其他情况返回`|(A-E)/E|`
 *
 * [1] 零点相对误差计算问题 https://math.stackexchange.com/questions/677852/how-to-calculate-relative-error-when-true-value-is-zero
 * [2] 相对变化与差异 https://en.wikipedia.org/wiki/Relative_change_and_difference
 * [3] 数学度量定义 https://en.wikipedia.org/wiki/Metric_(mathematics)#Definition
 * [4] F.W.J.奥尔弗，《误差算术新方法》SIAM数值分析期刊, 15(2), 1978, DOI:10.1137/0715024
 *
 * @param {number} actual 实际测量值
 * @param {number} expected 期望理论值
 * @return {number} 相对误差计算结果
 */
function relativeError(actual, expected) {
    // 以下条件判断逻辑已被测试覆盖
    // 由于c8工具存在标记问题，暂时忽略覆盖率统计
    /* c8 ignore start */
    if (actual === 0 && expected === 0) {
        return 0;
    }
    /* c8 ignore end */
    return Math.abs((actual - expected) / expected);
}

export default relativeError;
